'use strict';
const Controller = require('egg').Controller;
class TortiousController extends Controller {
    /**
     *@api {get} /tortious-list 侵权词列表 (同步词库)
     *@apiName tortious-list
     *@apiDescription 侵权词列表
     *@apiGroup Tortious
     *@apiPermission 用户认证
     *@apiHeader {string} [token] 用户认证字段
     *@apiParam {int} [page=1] 页码
     *@apiParam {int{1-200}} [page_size=50] 每页大小
     *@apiParam {string} [source] 站点
     *@apiParam {int} [last_sync_stime] 上次同步时间起 13位
     *@apiParam {int} [last_sync_etime] 上次同步时间止 13位
     *@apiParam {int} [updated_stime] 上次更新时间起 13位
     *@apiParam {int} [updated_etime] 上次更新时间止 13位
     *@apiSuccess {int} errcode  错误码
     *@apiSuccess {string} message 提示语
     *@apiSuccess {int} page   当前页码
     *@apiSuccess {int{1-200}} page_size 每页大小
     *@apiSuccess {int} count  查询总量
     *@apiSuccess {array[object]} rows 数据列表
     *@apiSuccess {int} rows.tort_word_id 侵权词ID
     *@apiSuccess {string} rows.word 侵权词
     *@apiSuccess {string} rows.source 站点
     *@apiSuccess {string} rows.hoder  注册人
     *@apiSuccess {array[number]} rows.nice_cl 类别ID列表
     *@apiSuccess {string} rows.app_data 侵权词时间
     *@apiSuccess {string} rows.status 侵权词状态
     *@apiSuccess {int} rows.updated_at 爬取更新时间 13位时间戳
     *@apiSuccess {int} rows.last_sync_time 上次同步时间 13位时间戳
     */
    async tortiousList() {
        const { ctx, service } = this;
        const query = ctx.query || {};
        query.page = Number(query.page) || 1;
        query.page_size = Number(query.page_size) || 50;
        if (query.page_size > 200) {
            query.page_size = 200;
        }
        const reponse = await service.tortious.tortiousList(query);
        ctx.json(reponse);
    }


    /**
     *@api {get} /tortious 侵权词列表 (展示查询)
     *@apiName show-tortious-list
     *@apiDescription 侵权词列表
     *@apiGroup Tortious
     *@apiPermission 用户认证
     *@apiHeader {string} [token] 用户认证字段
     *@apiParam {int} [page=1] 页码
     *@apiParam {int{1-200}} [page_size=50] 每页大小
     *@apiParam {string} [source] 站点
     *@apiParam {string} [category_id] 分类ID
     *@apiParam {string|array[string]} [word] 侵权词 支持模糊搜索和精准搜索 &emsp; string:模糊搜索 &emsp;array[string]:精准搜索
     *@apiParam {int} [updated_stime] 上次更新时间起 13位
     *@apiParam {int} [updated_etime] 上次更新时间止 13位
     *@apiSuccess {int} errcode  错误码
     *@apiSuccess {string} message 提示语
     *@apiSuccess {int} page   当前页码
     *@apiSuccess {int{1-200}} page_size 每页大小
     *@apiSuccess {int} count  查询总量
     *@apiSuccess {array[object]} rows 数据列表
     *@apiSuccess {int} rows.tort_word_id 侵权词ID
     *@apiSuccess {string} rows.word 侵权词
     *@apiSuccess {string} rows.source 站点
     *@apiSuccess {string} rows.hoder  注册人
     *@apiSuccess {array[number]} rows.nice_cl 类别ID列表
     *@apiSuccess {string} rows.app_data 侵权词时间
     *@apiSuccess {string} rows.status 侵权词状态
     *@apiSuccess {int} rows.updated_at 爬取更新时间 13位时间戳
     *@apiSuccess {int} rows.deleted_at  13位时间戳 &emsp; null:词为正常有效 &emsp;!null:词为作废删除
     */
    async showTortiousList() {
        const { ctx, service } = this;
        const query = ctx.query || {};
        query.page = Number(query.page) || 1;
        query.page_size = Number(query.page_size) || 50;
        if (query.page_size > 200) {
            query.page_size = 200;
        }
        if (query.word) {
            try {
                query.word = JSON.parse(query.word);
                query.word_mode = 2;
            } catch {
                query.word_mode = 1;
            }
        }
        if (!query.source) {
            query.source = ctx.app.config.erpSite;
        }
        const reponse = await service.tortious.showTortiousList(query);
        ctx.json(reponse);
    }

    /**
     *@api {put} /tortious/:tort_word_id  恢复/作废 侵权词
     *@apiName recovery-tortious  tort_word_id #清权祠ID
     *@apiDescription  恢复/作废 侵权词
     *@apiGroup Tortious
     *@apiPermission 用户认证
     *@apiHeader {string} [token] 用户认证字段
     *@apiParam {int} [state=1] 操作状态 1：恢复侵权词 0:作废侵权词
     *@apiSuccess {int} errcode  错误码
     *@apiSuccess {string} message 提示语
     */
    async recoveryOrDelTortious() {
        const { ctx, service } = this;
        const body = ctx.request.body;
        const tort_word_id = ctx.params.tort_word_id;
        const state = body.hasOwnProperty('state') ? body.state : 1;
        let reponse = {};
        switch (Number(state)) {
            case 1:
                reponse = await service.tortious.recoveryTortious(tort_word_id);
                break;
            case 0:
                reponse = await service.tortious.destroyTortious(tort_word_id);
                break;
            default:
                reponse = { errcode: ctx.ERRCODE.DATA_ERROR, message: 'state value must be 0 or 1', state };
                break;
        }
        return ctx.json(reponse);
    }


    /**
     *@api {post} /tortious  批量作废侵权词
     *@apiName delete-tortious-list
     *@apiDescription  批量作废侵权词
     *@apiGroup Tortious
     *@apiPermission 用户认证
     *@apiParam {array[int]} tort_word_ids 批量作废侵权词ID
     *@apiHeader {string} [token] 用户认证字段
     *@apiSuccess {int} errcode  错误码
     *@apiSuccess {string} message 提示语
     */
    async bulkDestroyTortious() {
        const { ctx, service } = this;
        const body = await ctx.multipartToJson() || ctx.request.body;
        let { tort_word_ids } = body;
        try {
            tort_word_ids = JSON.parse(tort_word_ids);
        } catch (err) {
            return ctx.json({ errcode: this.ctx.ERRCODE.DATA_ERROR, message: 'tort_word_ids incorrect format' });
        }
        if (!Array.isArray(tort_word_ids)) {
            return ctx.json({ errcode: this.ctx.ERRCODE.DATA_ERROR, message: 'tort_word_ids must be array' });
        }
        tort_word_ids = Array.from(new Set(tort_word_ids));
        const reponse = await service.tortious.destroyTortious(tort_word_ids);
        ctx.json(reponse);
    }

    /**
     *@api {get} /latest-tortious-info 最新入库详情
     *@apiName latest-tortious-info
     *@apiDescription 最新入库详情，即:抓取的最新时间信息
     *@apiGroup Tortious
     *@apiSuccess {int} errcode  错误码
     *@apiSuccess {string} message 提示语
     *@apiSuccess {object} data 数据
     *@apiSuccess {int} data.last_sync_time 最新上次同步时间
     *@apiSuccess {int} data.app_data 最新侵权词时间
     *@apiSuccess {int} data.count 总词数
     *@apiSuccess {int} data.trafficStatistics 爬取流量统计 
     */
    async latestTortiousInfo() {
        const { ctx, service } = this;
        const reponse = await service.tortious.latestTortiousInfo();
        ctx.json(reponse);
    }
}
module.exports = TortiousController;